![Amazon Linux 2上のPostfixで宛先ドメイン毎にリレー制御してみた](https://devio2023-media.developers.io/wp-content/uploads/2019/05/amazon-ec2.png)
Amazon Linux 2上のPostfixで宛先ドメイン毎にリレー制御してみた
構成
以下のようなイメージです。
環境/前提
- Postfixの設定については以下ブログの環境を前提としております
- Amazon Linux 2上のPostfixでローカルユーザにメール配送してみた
- SendGridが利用可能であること
- 参考HOME > 価格
- 本文中に出てくる
example.jp
は独自ドメインに読み替えてください
Route53設定
前提の環境に加え、迷惑メール対策としてexample.jp
のHosted ZoneにSPFレコード(TXTレコード)を追加しました。Valueは"v=spf1 a:test.example.jp -all"
を設定しています。
以下に従い、SPFレコードの代わりにTXTレコードにしています。
Postfix設定ファイル編集
/etc/postfix/main.cf
SendGridのSMTPサーバは認証が必要ですので、SMTPクライアントとして以下設定を行います。前提の環境で設定しているsmtpd_sasl_auth_enable
と、今回設定するsmtp_sasl_auth_enable
は別物なのでご注意ください。
smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous smtp_tls_security_level = may transport_maps = hash:/etc/postfix/transport smtp_sasl_password_maps = hash:/etc/postfix/relay_password
/etc/postfix/transport
宛先ドメイン毎のリレー先設定を行います。ここでは宛先ドメインがclassmethod.jp
の場合にSendGridにリレーし、その他の宛先についてはリレーせずに直接送信する設定です。
classmethod.jp smtp:[smtp.sendgrid.net]:587 * :
/etc/postfix/relay_password
リレー先の認証情報を記載するファイルを作成します。ここではSMTP認証が必要となるSendGridのSMTP認証情報を設定します。
[smtp.sendgrid.net]:587 apikey:SendGridのAPIキー
SendGridのAPIキーの発行など、詳細については以下を確認ください。
設定ファイルのハッシュ化
リレー関連で更新した設定ファイルをハッシュ化します。
$ sudo postmap /etc/postfix/transport $ sudo postmap /etc/postfix/relay_password
Postfixの再起動
Postfixを再起動して設定を反映します。
$ sudo service postfix restart Redirecting to /bin/systemctl restart postfix.service $ sudo service postfix status Redirecting to /bin/systemctl status postfix.service ● postfix.service - Postfix Mail Transport Agent Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled) Active: active (running) since 月 2020-03-23 08:53:23 UTC; 4s ago (省略)
動作確認
ここではmailxコマンドを利用して動作を確認してみたいと思います。
パッケージインストール
必要なパッケージをインストールします。
$ sudo yum install mailx
リレー確認
宛先ドメインがclassmethod.jp
のケースです。マスクしていますが以下のようなコマンドでEC2(MTAサーバ)からメールを送信しました。
echo "This is a test mail"| mail -s "Test Mail" -r test@example.jp xx@classmethod.jp
SendGridを通して送信が行われたか、SendGridのコンソール「Activity」を確認してみます。イベントがDelivered
になっており、受信側メールサーバに送付されていそうです。
SendGrid経由でメールが送信されていることを確認できました。
直接送信
宛先ドメインにclassmethod.jp
以外を指定するケースです。マスクしていますが以下のようなコマンドでEC2(MTAサーバ)からメールを送信しました。
echo "This is a test mail"| mail -s "Test Mail" -r test@example.jp xx@gmail.com
SendGridを経由せずメールが送信されていることを確認できました。
さいごに
Postfixにて宛先ドメイン毎のリレー制御を実施する方法をご紹介しました。EC2から直接メールを送信する場合、25ポートの解除申請や、SPFレコード(TXTレコード)等、迷惑メール判定されないよう意識することが多くあると改めて実感しました。直接送信する特別な理由がなければ、SendGrid等から送信することで、迷惑メール判定との闘いは減るのではないでしょうか。